今天的主題是前天有提到的 Enum class ,我們來看看 Enum 可以做到哪些事吧!以下如有解釋不清或是描述錯誤的地方還請大家多多指教:
之前有提到說 sealed class 和 enum class 都是可以來表示一個物件的不同狀態,只是差異是持有的 instances 是單一的還是可以多個。emun 通常都是以預先定義好的值呈現,稱作 type-safe enums:
// 逗號分開,文字都是以大寫表示
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
除了基本的狀態外,enum class 還可以自定義 properties 和方法,也可以實作多個介面:
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
這樣每個常數會與設定的變數有對應的關聯:
enum 在 compile 後會產生可以取得 value 的 properties。
Color.values().forEach {
println("${it.ordinal}:${it.name} / ${it.rgb}")
}
// 0:RED / 16711680
// 1:GREEN / 65280
// 2:BLUE / 255
如果想客製一些方法或是參數,先在最後一個常數加 ; 表示列舉的參數結束,下面就可以客製自己的方法。
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF);
fun relation (): String {
return "[$rgb]"
}
}
println(Color.BLUE.relation()) // [255]
enum class Game {
PAPER {
override fun winTo() = STONE
},
SCISSORS {
override fun winTo() = PAPER
},
STONE {
override fun winTo() = SCISSORS
};
abstract fun winTo(): Game
}
print("${Game.PAPER.winTo()}") // STONE
interface Play {
fun winTo() : Game
}
enum class Game : Play {
PAPER {
override fun winTo() = STONE
},
SCISSORS {
override fun winTo() = PAPER
},
STONE {
override fun winTo() = SCISSORS
};
}
print("${Game.PAPER.winTo()}") // STONE
透過 Enum 來選擇要顯示的圖示,以主頁為例:
sealed class HomeVo
...
data class CityDayTemp(
val day: String,
val maxTemp: String,
val minTemp: String,
val icon: IconType
)
data class CityHourTemp(
val cityId: Int,
val time: String,
val temp: String,
val iconType: IconType
) : HomeVo(cityId)
...
// 天氣圖示
enum class IconType {
RAIN, SUN, CLOUD
}